package com.ldxiwxr.common.utils;

import cn.hutool.core.net.NetUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import com.ldxiwxr.common.common.MapResult;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import static com.ldxiwxr.common.constant.CommonConstant.*;

/**
 * IP属地工具类
 * @author SuBanxia
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class IPUtils {

    public static MapResult getMapResult(String ip){
        if (StringUtils.isBlank(ip)) {
            return null;
        }
        // 内网不查询
        ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
        if (NetUtil.isInnerIP(ip)) {
            return null;
        }
        //发送GET请求获取获取返回的对应的json对象
        try {
            String rspStr = HttpUtil.createGet(IP_URL + "ip=" + ip + "&token=" + TOKEN_API)
                    .execute()
                    .body();
            //判断返回对象是否为空
            if (StringUtils.isEmpty(rspStr)) {
                return null;
            }
            //读取内容并将其封装成Dict对象
            JSONObject json = new JSONObject(rspStr);
            JSONObject content = json.getJSONObject("data");
            //通过属性值获取对应的经纬度
            MapResult mapResult = new MapResult();
            mapResult.setLatitude(content.getStr("latitude"));
            mapResult.setLongitude(content.getStr("longitude"));
            //返回结果
            return mapResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过IP获取IP属地
     * @param ip IP属地
     */
    public static String getAddressByIp(String ip) {
        String address = UNKNOWN_IP;
        if (StringUtils.isBlank(ip)) {
            return address;
        }
        // 内网不查询
        ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
        if (NetUtil.isInnerIP(ip)) {
            return LOCAL_AREA_NETWORK;
        }
            //发送GET请求获取获取返回的对应的json对象
            try {
                String rspStr = HttpUtil.createGet(IP_URL + "ip=" + ip + "&token=" + TOKEN_API)
                        .execute()
                        .body();
                //判断返回对象是否为空
                if (StringUtils.isEmpty(rspStr)) {
                    return UNKNOWN_IP;
                }
                //读取内容并将其封装成Dict对象
                JSONObject json = new JSONObject(rspStr);
                JSONObject content = json.getJSONObject("data");
                //通过属性值获取对应的内容
                String country = content.getStr("country");
                String province = content.getStr("province");
                String city = content.getStr("city");
                //返回结果
                return String.format("%s-%s-%s",country, province, city);
            } catch (Exception e) {
                e.printStackTrace();
            }
        //不执行成功，默认返回未知属地
        return UNKNOWN_IP;
    }
}
